#include "app_manager.h"
// lib
#include <string.h>
#include "debug.h"
#include "FreeRTOS.h"
// bsp
// #include "bsp_led_ctrl.h"
// #include "bsp_ec800u.h"
// #include "bsp_rtc.h"
// #include "bsp_store.h"
// #include "bsp_485.h"
// // app
// #include "app_global.h"             // 全局变量与通用函数
// #include "common_param.h"           // 设备参数相关
#include "task_system.h"            // 系统管理相关任务代码
// #include "restart_info.h"
#include "task_test.h"
// #include "modbus_master.h"          // modbus master协议实现相关任务代码
// #include "task_modbus_master.h"     // modbus master协议解析相关任务代码

void App_Advanced_Init(void);
void App_Application_Create(void);

/**
 * @brief 
 * 
 */
void App_Init(void)
{
    _DEBUG_PRINT(DBG_SYS, "app start ...\r\n");

    // //创建全局事件列表
    // global_event = xEventGroupCreate();

    // // 创建高级初始化任务
    // xTaskCreate((TaskFunction_t)App_Advanced_Init, "adv_init", 256, NULL, 1, NULL);
    // // 创建应用层任务
    // xTaskCreate((TaskFunction_t)App_Application_Create, "app_create", 256, NULL, 1, NULL);
    // 创建test任务
    xTaskCreate((TaskFunction_t)App_Application_Test, "Test_Task", 256, NULL, 2, NULL);
    // xTaskCreate((TaskFunction_t)App_Application_Test_2, "Test_2_Task", 256, NULL, 2, NULL);
    // 创建喂狗任务
    xTaskCreate((TaskFunction_t)Task_System_Watch_Dog_Feed, "feed_dog", 128, NULL, 1, NULL);

    #if 0
    // 初始化RS485主机通道
    Mm_Init(&mm_485_0, Bsp_485_Read, Bsp_485_Write);
    // RS485-Modbus主机任务---------------------------------------------------------------------------------------
    // 定时获取从机状态任务
    xTaskCreate((TaskFunction_t)Mm_State_Polling_Task, "mm_state_polling", 128, NULL, 4, NULL);
    // RS485-Modbus主机状态机任务
    xTaskCreate((TaskFunction_t)Mm_Fsm_Task, "mm_fsm", 128, NULL, 4, NULL);
    #endif

    _DEBUG_PRINTF(DBG_SYS, "FreeRTOS Start\r\n");
    vTaskStartScheduler(); // RTOS调度开始
    //! 不允许执行到这里
    _DEBUG_PRINT(DBG_ERR, "ERROR! SYSTEM STACK ERROR!!!\r\n");
}

/**
 * @brief 高级初始化任务
 *
 */
void App_Advanced_Init(void)
{
    _DEBUG_PRINTF(DBG_APP, "advanced init start\r\n");
    #if 0
    // 初始化RS485主机通道
    Mm_Init(&mm_485_0, Bsp_485_Read, Bsp_485_Write);
    // 初始化外部Flash参数
    Bsp_Store_Init();
    // 从掉电储存器读取参数
    Common_Param_Update_Form_Rom();
    // 从备份寄存器读取重启信息
    Restart_Info_Read_Bpr();
    // 从设备读取/生成参数
    Common_Param_Update_Form_Device();
    // 打印开机信息页
    System_Info_Print();
    //设置初始化完成标志位
    xEventGroupSetBits(global_event, app_advanced_init_done);
    #endif
    _DEBUG_PRINTF(DBG_APP, "advanced init started, delete\r\n");
    vTaskDelete(NULL); // 删除本任务
}

/**
 * @brief 创建应用层任务
 *
 */
void App_Application_Create(void)
{
    #if 0
    // 等待高级初始化结束
    xEventGroupWaitBits(global_event, app_advanced_init_done, pdFALSE, pdFALSE, portMAX_DELAY);
    _DEBUG_PRINTF(DBG_APP, "create application task\r\n");

    if(!(xEventGroupGetBits(global_event)&use_offline_mode))        // 如果工作于在线模式
    {
        _DEBUG_PRINTF(DBG_APP, "use online mode\r\n");
    }

    // xxx任务--------------------------------------------------------------------------------------------------
    // xxx初始化

    // RS485-Modbus主机任务---------------------------------------------------------------------------------------
    // 定时获取从机状态任务
    xTaskCreate((TaskFunction_t)Mm_State_Polling_Task, "mm_state_polling", 128, NULL, 5, NULL);
    // RS485-Modbus主机状态机任务
    xTaskCreate((TaskFunction_t)Mm_Fsm_Task, "mm_fsm", 128, NULL, 4, NULL);

    //离线模式下，调用保存的工作时间区间，并置位工作条件
    if(xEventGroupGetBits(global_event)&use_offline_mode)
    {
        _DEBUG_PRINTF(DBG_APP, "use offline mode\r\n");
        //获取RTC时间，判断当前RTC时间是否为正确的北京时间
        uint16_t time_list[6];
        Rtc_Get_Time(time_list);
        if(time_list[year] >= 2023)//如果RTC内部已记录了北京时间
        {
            //则以上次通信保存的服务器设置来运行
            disinsection.control_mode = system_param.dis_param.control_mode;
            disinsection.run_time = system_param.dis_param.run_time;
            disinsection.end_time = system_param.dis_param.end_time;
        }
        else
        {
            //否则只能以光控模式运行
            disinsection.control_mode = 0;//光控模式
            disinsection.run_time = 8;//默认工作八小时（机器人也要讲劳动法！
            disinsection.end_time = 0;
        }
        xEventGroupSetBits(disinsection_event, disinsection_get_work_time);
        xEventGroupSetBits(disinsection_event, disinsection_get_report_frq);
    }

    _DEBUG_PRINTF(DBG_APP, "delete created-application-task\r\n");
    vTaskDelete(NULL); // 删除本任务
    #endif
}
